Skip to content

三、Linux + GCC

3.1 目录结构

Linux 下 C++ 项目的目录结构

text
项目目录/
├── include/
│   ├── c_interface/          # C 接口头文件
│   ├── cpp_interface/        # C++ 接口主入口
│   └── parameter/            # 参数结构体头文件
├── lib/
│   └── libnrc_host.so        # Linux 动态库
├── src/
│   └── main.cpp
└── Makefile

3.2 Makefile

makefile
TARGET=demo
all:
	g++ -o $(TARGET) src/*.cpp -I./include -L./lib -lnrc_host -lpthread -lm -ldl -lrt -lstdc++ -std=c++11 -fPIC
clean:
	rm -f $(TARGET)

3.3 运行时动态库路径

编译成功后运行前,需要让系统能找到 libnrc_host.so

bash
# 方式一:设置 LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH
./demo
# 方式二:将库复制到系统目录
sudo cp lib/libnrc_host.so /usr/local/lib/
sudo ldconfig
./demo

3.4 头文件路径与最小连接代码

3.4.1 头文件包含路径

SDK 头文件之间存在两层 #include 关系,集成到自有工程时若目录结构与 3.1 节不同,需要同步调整这些路径,否则编译会报 No such file or directory

第一层:nrc_api.h 包含同目录下的其他接口头文件

nrc_api.h 与下列头文件同位于 include/cpp_interface/ 目录,直接用文件名引用即可:

cpp
// include/cpp_interface/nrc_api.h
#include "nrc_craft_conveyor_belt_track.h"
#include "nrc_craft_vision.h"
#include "nrc_craft_weld.h"
#include "nrc_interface.h"
#include "nrc_io.h"
#include "nrc_job_operate.h"
#include "nrc_modbus.h"
#include "nrc_queue_operate.h"
#include "nrc_track.h"
#include "nrc_dual_arm.h"

第二层:被包含的头文件再引用 parameter/ 目录下的参数头文件

由于 cpp_interface/parameter/include/ 下的平级目录,被包含的头文件使用 ../parameter/ 相对路径引用参数定义。以 nrc_craft_conveyor_belt_track.h 为例:

cpp
// include/cpp_interface/nrc_craft_conveyor_belt_track.h
#include "../parameter/nrc_define.h"
#include "../parameter/nrc_craft_conveyor_belt_track_parameter.h"

若你的工程把 parameter/ 放到了其他位置(如 cpp_interface/ 内部,或重命名了目录),需要同步修改这些 #include 路径。

3.4.2 最小连接代码

cpp
#include <iostream>
#include <unistd.h>
#include "../include/cpp_interface/nrc_api.h"

int main() {
    std::cout << "正在连接控制器..." << std::endl;
    SOCKETFD fd = connect_robot("192.168.1.15", "6001");
    if (fd <= 0) {
        std::cout << "连接失败" << std::endl;
        return 1;
    }

    // 等待连接就绪
    while (get_connection_status(fd) != 0) {
        usleep(200000);
    }

    std::cout << "连接成功: " << fd << std::endl;
    std::cout << "SDK 版本: " << get_library_version() << std::endl;
    std::cout << "连接状态: " << get_connection_status(fd) << std::endl;

    // 断开连接
    disconnect_robot(fd);
    return 0;
}

3.5 编译运行

bash
make
export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH
./demo

输出 连接成功: 1 即表示配置正确。

下一步

完成连接测试后,请浏览接口示例了解更多 API 用法。